home *** CD-ROM | disk | FTP | other *** search
- //========================================================================================
- //
- // File: ContainerCmds.cpp
- // Release Version: $ 1.0d11 $
- //
- // Author: Mary Boetcher
- //
- // Copyright: © 1993, 1995 by Apple Computer, Inc., all rights reserved.
- //
- //========================================================================================
-
- #include "Container.hpp"
-
- #ifndef CONTAINERCMDS_H
- #include "ContainerCmds.h"
- #endif
-
- #ifndef CONTAINERPART_H
- #include "ContainerPart.h"
- #endif
-
- #ifndef CONTAINERSEL_H
- #include "ContainerSel.h"
- #endif
-
- #ifndef CONTAINERCLIP_H
- #include "ContainerClip.h"
- #endif
-
- #ifndef BASESHP_H
- #include "BaseShp.h"
- #endif
-
- #ifndef CONTAINERFRM_H
- #include "ContainerFrm.h"
- #endif
-
- // ----- FrameWork Includes -----
-
- #ifndef FWPRESEN_H
- #include "FWPresen.h"
- #endif
-
- #ifndef FWMEMMGR_H
- #include "FWMemMgr.h"
- #endif
-
- #ifndef SOM_ODShape_xh
- #include <Shape.xh>
- #endif
-
-
- //========================================================================================
- // RunTime Info
- //========================================================================================
-
- #ifdef FW_BUILD_MAC
- #pragma segment containercommand
- #endif
-
- //========================================================================================
- // CContainerShapeCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CContainerShapeCommand constructor
- //----------------------------------------------------------------------------------------
- CContainerShapeCommand::CContainerShapeCommand(Environment* ev,
- CContainerPart* part,
- FW_CFrame* frame,
- CContainerSelection* selection,
- CBaseShape* newShape) :
- #if defined(FW_BUILD_WIN) && FW_OPENDOC_VERSION == FW_OPENDOC_DR1
- FW_CCommand(ev, cContainerShapeCommand, frame, FW_kCantUndo),
- #else
- FW_CCommand(ev, cContainerShapeCommand, frame, FW_kCanUndo),
- #endif
- fContainerPart(part),
- fContainerSelection(selection),
- fNewShape(newShape)
- {
- this->SetMenuStrings(ev, "Undo Containering", "Redo Containering");
- }
-
- //----------------------------------------------------------------------------------------
- // CContainerShapeCommand destructor
- //----------------------------------------------------------------------------------------
- CContainerShapeCommand::~CContainerShapeCommand()
- {
- }
-
- //----------------------------------------------------------------------------------------
- // CContainerShapeCommand::CommitUndone
- //----------------------------------------------------------------------------------------
- void CContainerShapeCommand::CommitUndone(Environment* ev)
- {
- // Delete the new shape only if the containering was undone
- delete fNewShape;
- }
-
- //----------------------------------------------------------------------------------------
- // CContainerShapeCommand::DoIt
- //----------------------------------------------------------------------------------------
- void CContainerShapeCommand::DoIt(Environment* ev) // Override
- {
- fContainerPart->AddShape(ev, fNewShape);
- }
-
- //----------------------------------------------------------------------------------------
- // CContainerShapeCommand::UndoIt
- //----------------------------------------------------------------------------------------
- void CContainerShapeCommand::UndoIt(Environment* ev) // Override
- {
- // First select the shape
- this->SelectSavedShape(ev);
-
- // Now remove the selected shape
- fContainerSelection->ClearSelection(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CContainerShapeCommand::RedoIt
- //----------------------------------------------------------------------------------------
- void CContainerShapeCommand::RedoIt(Environment* ev) // Override
- {
- fContainerPart->AddShape(ev, fNewShape);
- this->SelectSavedShape(ev); // select and recontainer the shape
- }
-
- //----------------------------------------------------------------------------------------
- // CContainerShapeCommand::SelectSavedShape
- //----------------------------------------------------------------------------------------
- void CContainerShapeCommand::SelectSavedShape(Environment* ev)
- {
- // Add the saved shape to the selection
- fContainerSelection->CloseSelection(ev); // first make sure selection is empty
- fContainerSelection->AddToSelection(ev, fNewShape, FALSE);
- fContainerSelection->RecontainerShape(ev, fNewShape);
- }
-
- //========================================================================================
- // CResizeShapeCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand constructor
- //----------------------------------------------------------------------------------------
- CResizeShapeCommand::CResizeShapeCommand(Environment* ev,
- CContainerPart* part,
- FW_CFrame* frame,
- CContainerSelection* selection,
- const FW_CRect& srcRect,
- const FW_CRect& dstRect) :
- #if defined(FW_BUILD_WIN) && FW_OPENDOC_VERSION == FW_OPENDOC_DR1
- FW_CCommand(ev, cResizeCommand, frame, FW_kCantUndo),
- #else
- FW_CCommand(ev, cResizeCommand, frame, FW_kCanUndo),
- #endif
- fContainerPart(part),
- fFrame(frame),
- fContainerSelection(selection),
- fSourceRect(srcRect),
- fDestRect(dstRect),
- fUpdateShape(NULL)
- {
- fChangedShapeList = new FW_CPrivOrderedCollection;
-
- this->SetMenuStrings(ev, "Undo Resize", "Redo Resize");
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand destructor
- //----------------------------------------------------------------------------------------
- CResizeShapeCommand::~CResizeShapeCommand()
- {
- delete fChangedShapeList;
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::DoIt
- //----------------------------------------------------------------------------------------
- void CResizeShapeCommand::DoIt(Environment* ev) // Override
- {
- this->SaveUndoState(ev);
-
- fContainerSelection->MapSelection(ev, fSourceRect, fDestRect);
- this->Recontainer(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::UndoIt
- //----------------------------------------------------------------------------------------
- void CResizeShapeCommand::UndoIt(Environment* ev) // Override
- {
- // First select the changed shapes
- this->SelectChangedShapes(ev);
-
- fContainerSelection->MapSelection(ev, fDestRect, fSourceRect); // ???
- this->Recontainer(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::RedoIt
- //----------------------------------------------------------------------------------------
- void CResizeShapeCommand::RedoIt(Environment* ev) // Override
- {
- // First select the changed shapes
- this->SelectChangedShapes(ev);
-
- fContainerSelection->MapSelection(ev, fSourceRect, fDestRect);
- this->Recontainer(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::SaveUndoState
- //----------------------------------------------------------------------------------------
-
- void CResizeShapeCommand::SaveUndoState(Environment* ev) // Override
- {
- // Copy selected shape pointers to fChangedShapeList
- FW_COrderedCollectionIterator ite(fContainerSelection->GetSelectionCollection());
- for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
- {
- fChangedShapeList->AddLast(shape);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::Recontainer
- //----------------------------------------------------------------------------------------
- void CResizeShapeCommand::Recontainer(Environment* ev)
- {
- FW_CPresentation* presentation = fFrame->GetPresentation(ev);
- CContainerFacetClipper facetClipper(ev, fContainerPart);
-
- if (fUpdateShape) // UndoIt, RedoIt
- {
- fUpdateShape->Union(ev, fContainerSelection->GetUpdateShape());
- presentation->Invalidate(ev, fUpdateShape);
-
- facetClipper.Clip(ev, presentation, fUpdateShape);
-
- fUpdateShape->Release(ev);
- fUpdateShape = NULL;
- }
- else // DoIt
- {
- presentation->Invalidate(ev, fContainerSelection->GetUpdateShape());
-
- facetClipper.Clip(ev, presentation, fContainerSelection->GetUpdateShape());
- }
-
- fContainerSelection->SelectionChanged(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::SelectChangedShapes
- //----------------------------------------------------------------------------------------
- void CResizeShapeCommand::SelectChangedShapes(Environment* ev)
- {
- // First, empty the selection
- fContainerSelection->CloseSelection(ev);
-
- // Add the shapes in fChangedShapeList to fContainerSelection
- FW_COrderedCollectionIterator ite(fChangedShapeList);
- for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
- {
- fContainerSelection->AddToSelection(ev, shape, FALSE);
- }
-
- // Save update shape for Recontainer
- fUpdateShape = fContainerSelection->GetUpdateShape()->Copy(ev);
- }
-
- //========================================================================================
- // CChangeShapeCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand constructor
- //----------------------------------------------------------------------------------------
-
- CChangeShapeCommand::CChangeShapeCommand(Environment* ev,
- ODCommandID id,
- CContainerPart* part,
- FW_CFrame* frame,
- CContainerSelection* selection)
- #if defined(FW_BUILD_WIN) && FW_OPENDOC_VERSION == FW_OPENDOC_DR1
- : FW_CCommand(ev, id, frame, FW_kCantUndo),
- #else
- : FW_CCommand(ev, id, frame, FW_kCanUndo),
- #endif
- fContainerPart(part),
- fContainerSelection(selection)
- {
- fChangedShapeList = new FW_CPrivOrderedCollection;
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand destructor
- //----------------------------------------------------------------------------------------
-
- CChangeShapeCommand::~CChangeShapeCommand()
- {
- delete fChangedShapeList;
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand::SelectChangedShapes
- //----------------------------------------------------------------------------------------
-
- void CChangeShapeCommand::SelectChangedShapes(Environment* ev)
- {
- // First, empty the selection
- fContainerSelection->CloseSelection(ev);
-
- // Add the shapes in fChangedShapeList to fContainerSelection
- FW_COrderedCollectionIterator ite(fChangedShapeList);
- for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
- {
- fContainerSelection->AddToSelection(ev, shape, FALSE);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand::DoIt
- //----------------------------------------------------------------------------------------
-
- void CChangeShapeCommand::DoIt(Environment* ev) // Override
- {
- this->SaveUndoState(ev);
- this->DoChange(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand::UndoIt
- //----------------------------------------------------------------------------------------
-
- void CChangeShapeCommand::UndoIt(Environment* ev) // Override
- {
- this->SelectChangedShapes(ev);
-
- // Iterate through shapes in fChangedShapeList, undoing each change
- FW_COrderedCollectionIterator ite(fChangedShapeList);
- unsigned long index = 0;
- for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
- {
- this->UndoShape(ev, shape, index);
- fContainerSelection->RecontainerShape(ev, shape);
- index++;
- }
-
- fContainerSelection->SelectionChanged(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand::RedoIt
- //----------------------------------------------------------------------------------------
-
- void CChangeShapeCommand::RedoIt(Environment* ev) // Override
- {
- this->SelectChangedShapes(ev);
- this->DoChange(ev);
- fContainerSelection->SelectionChanged(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand::SaveUndoState
- //----------------------------------------------------------------------------------------
-
- void CChangeShapeCommand::SaveUndoState(Environment* ev) // Override
- {
- // Copy selected shape pointers to fChangedShapeList
- FW_COrderedCollectionIterator ite(fContainerSelection->GetSelectionCollection());
- for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
- {
- fChangedShapeList->AddLast(shape);
- }
- }
-
- //========================================================================================
- // CChangeColorCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CChangeColorCommand constructor
- //----------------------------------------------------------------------------------------
-
- CChangeColorCommand::CChangeColorCommand(Environment* ev,
- ODCommandID commandID,
- CContainerPart* part,
- FW_CFrame* frame,
- CContainerSelection* selection,
- const FW_CColor& newColor)
- : CChangeShapeCommand(ev, commandID, part, frame, selection),
- fNewColor(newColor),
- fOldColors(NULL),
- fIsFill(commandID == cChangeFillColor)
- {
- if (fIsFill)
- this->SetMenuStrings(ev, "Undo Fill Color Change", "Redo Fill Color Change");
- else
- this->SetMenuStrings(ev, "Undo Frame Color Change", "Redo Frame Color Change");
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeColorCommand destructor
- //----------------------------------------------------------------------------------------
-
- CChangeColorCommand::~CChangeColorCommand()
- {
- FW_CMemoryManager::FreeBlock(fOldColors);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeColorCommand::DoChange
- //----------------------------------------------------------------------------------------
-
- void CChangeColorCommand::DoChange(Environment* ev) // Override
- {
- fContainerSelection->ChangeSelectionColor(ev, fNewColor, fIsFill);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeColorCommand::UndoShape
- //----------------------------------------------------------------------------------------
-
- void CChangeColorCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index) // Override
- {
- if (fIsFill)
- shape->ChangeFillColor(ev, fContainerPart, fOldColors[index]);
- else
- shape->ChangeFrameColor(ev, fContainerPart, fOldColors[index]);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeColorCommand::SaveUndoState
- //----------------------------------------------------------------------------------------
-
- void CChangeColorCommand::SaveUndoState(Environment* ev) // Override
- {
- CChangeShapeCommand::SaveUndoState(ev); // sets up fChangedShapeList
-
- // Create array to hold colors
- unsigned long shapeCount = fChangedShapeList->Count();
- fOldColors = (FW_CColor*)FW_CMemoryManager::AllocateBlock(sizeof(FW_CColor) * shapeCount);
-
- // Save shapes' colors
- FW_CColor color;
- short index = 0;
- FW_COrderedCollectionIterator ite(fChangedShapeList);
- for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
- {
- shape->GetColor(fIsFill, color);
- fOldColors[index] = color;
- index++;
- }
- }
-
- //========================================================================================
- // class CChangePatternCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CChangePatternCommand constructor
- //----------------------------------------------------------------------------------------
-
- CChangePatternCommand::CChangePatternCommand(Environment* ev,
- ODCommandID commandID,
- CContainerPart* part,
- FW_CFrame* frame,
- CContainerSelection* selection,
- const FW_PPattern& newPattern)
- : CChangeShapeCommand(ev, commandID, part, frame, selection),
- fNewPattern(newPattern),
- fOldPatterns(NULL),
- fCount(0),
- fIsFill(commandID == cChangeFillPattern)
- {
- if (fIsFill)
- this->SetMenuStrings(ev, "Undo Fill Pattern Change", "Redo Fill Pattern Change");
- else
- this->SetMenuStrings(ev, "Undo Frame Pattern Change", "Redo Frame Pattern Change");
-
- FW_END_CONSTRUCTOR
- }
-
- //----------------------------------------------------------------------------------------
- // CChangePatternCommand destructor
- //----------------------------------------------------------------------------------------
-
- CChangePatternCommand::~CChangePatternCommand()
- {
- FW_START_DESTRUCTOR
-
- delete [] fOldPatterns;
- }
-
- //----------------------------------------------------------------------------------------
- // CChangePatternCommand::DoChange
- //----------------------------------------------------------------------------------------
-
- void CChangePatternCommand::DoChange(Environment* ev) // Override
- {
- fContainerSelection->ChangeSelectionPattern(ev, fNewPattern, fIsFill);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangePatternCommand::UndoShape
- //----------------------------------------------------------------------------------------
-
- void CChangePatternCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index) // Override
- {
- if (fIsFill)
- shape->ChangeFillPattern(ev, fContainerPart, fOldPatterns[index]);
- else
- shape->ChangeFramePattern(ev, fContainerPart, fOldPatterns[index]);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangePatternCommand::SaveUndoState
- //----------------------------------------------------------------------------------------
-
- void CChangePatternCommand::SaveUndoState(Environment* ev) // Override
- {
- CChangeShapeCommand::SaveUndoState(ev); // sets up fChangedShapeList
-
- // Create array to hold patterns
- fOldPatterns = new FW_PPattern[fChangedShapeList->Count()];
-
- // Save shapes' patterns
- FW_COrderedCollectionIterator ite(fChangedShapeList);
- for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
- {
- fOldPatterns[fCount] = shape->GetPattern(fIsFill)->Copy();
- fCount++;
- }
- }
-
- //========================================================================================
- // class CChangeRenderVerbCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CChangeRenderVerbCommand constructor
- //----------------------------------------------------------------------------------------
-
- CChangeRenderVerbCommand::CChangeRenderVerbCommand(Environment* ev,
- CContainerPart* part,
- FW_CFrame* frame,
- CContainerSelection* selection,
- unsigned short newRenderVerb)
- : CChangeShapeCommand(ev, cChangeRenderVerb, part, frame, selection),
- fNewRenderVerb(newRenderVerb),
- fOldRenderVerbs(NULL)
- {
- this->SetMenuStrings(ev, "Undo Render Verb Change", "Redo Render Verb Change");
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeRenderVerbCommand destructor
- //----------------------------------------------------------------------------------------
-
- CChangeRenderVerbCommand::~CChangeRenderVerbCommand()
- {
- delete [] fOldRenderVerbs;
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeRenderVerbCommand::DoChange
- //----------------------------------------------------------------------------------------
-
- void CChangeRenderVerbCommand::DoChange(Environment* ev) // Override
- {
- fContainerSelection->ChangeSelectionRenderVerb(ev, fNewRenderVerb);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeRenderVerbCommand::UndoShape
- //----------------------------------------------------------------------------------------
-
- void CChangeRenderVerbCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index) // Override
- {
- shape->ChangeRenderVerb(ev, fContainerPart, fOldRenderVerbs[index]);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeRenderVerbCommand::SaveUndoState
- //----------------------------------------------------------------------------------------
-
- void CChangeRenderVerbCommand::SaveUndoState(Environment* ev) // Override
- {
- CChangeShapeCommand::SaveUndoState(ev); // sets up fChangedShapeList
-
- // Create array to hold render verbs
- unsigned long shapeCount = fChangedShapeList->Count();
- fOldRenderVerbs = new unsigned short[shapeCount];
-
- // Finally, save shapes' render verbs
- unsigned short verb;
- short index = 0;
- FW_COrderedCollectionIterator ite(fChangedShapeList);
- for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
- {
- verb = shape->GetRenderVerb();
- fOldRenderVerbs[index] = verb;
- }
- }
-